package com.peng.utils;

import com.peng.entity.Permission;
import com.peng.vo.RouterVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Predicate;

/**
 * 生成菜单树
 */
public class MenuTree {

    /**
     * 生成路由
     *
     * @param menuList 菜单列表
     * @param pid      父菜单id
     * @return
     */
    public static List<RouterVo> makeRouter(List<Permission> menuList, Long pid) {
        // 创建集合保存路由信息
        List<RouterVo> routerVoList = new ArrayList<>();
        // 判断菜单列表是否为空，如果不为空则使用菜单列表，否则创建集合对象
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())
                .stream()
                // 筛选不为空的菜单及与菜单父id相同的数量
                .filter(permission -> permission != null && permission.getParentId() == pid)
                .forEach(new Consumer<Permission>() {
                    @Override
                    public void accept(Permission permission) {
                        // 创建路由对象
                        RouterVo routerVo = new RouterVo();
                        routerVo.setName(permission.getName());// 路由名称
                        routerVo.setPath(permission.getPath()); // 路由地址
                        // 判断当前菜单是否为一级菜单
                        if (permission.getParentId() == 0L) {
                            routerVo.setComponent("Layout");//一级菜单组件
                            routerVo.setAlwaysShow(true); // 显示路由
                        } else {
                            routerVo.setComponent(permission.getUrl());// 具体的某一个组件
                            routerVo.setAlwaysShow(false); // 折叠路由菜单
                        }
                        // 设置meta信息
                        routerVo.setMeta(routerVo.new Meta(permission.getLabel(), permission.getIcon(), permission.getCode().split(",")));
                        // 递归生成路由
                        List<RouterVo> children = makeRouter(menuList, permission.getId());
                        routerVo.setChildren(children);// 设置子路由到路由对象中
                        // 将路由信息添加到集合
                        routerVoList.add(routerVo);
                    }
                });
        // 返回路由信息
        return routerVoList;
    }

    /**
     * 生成菜单树
     *
     * @param menuList 菜单列表
     * @param pid      父菜单id
     * @return
     */
    public static List<Permission> makeMenuTree(List<Permission> menuList, Long pid) {
        // 创建集合保存菜单数据
        List<Permission> permissionList = new ArrayList<>();
        // 判断菜单列表是否为空，如果不为空则使用菜单列表，否则创建集合对象
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())
                .stream().filter(new Predicate<Permission>() {
                    @Override
                    public boolean test(Permission permission) {
                        return permission != null && permission.getParentId() == pid;
                    }
                })
                .forEach(item -> {
                    // 创建权限菜单对象
                    Permission permission = new Permission();
                    // 将原有的属性复制给菜单对象
                    BeanUtils.copyProperties(item, permission);
                    // 获取每一个item对象的子菜单，递归生成菜单树
                    List<Permission> children = makeMenuTree(menuList, item.getId());
                    // 设置子菜单
                    permission.setChildren(children);
                    // 将菜单对象添加到集合
                    permissionList.add(permission);
                });
        // 返回菜单信息
        return permissionList;
    }
}
